/**
 * 删除相邻数字的最大分数
 *
 * 描述
 * 给定一个长度为 n 的仅包含正整数的数组，另外有一些操作，每次操作你可以选择数组
 * 中的任意一个元素 ai, 同时数组中所有等于 ai−1和 ai+1
 * 同时你可以得到 ai分，直到所有的元素都被选择或者删除。
 * 请你计算最多能得到多少分。
 * 数据范围： 数组长度满足 1≤ n ≤10^5, 数组中的元素大小都满足 1≤ ai ≤10^4
 *
 *
 * 输入描述：
 * 第一行输入一个正整数 n 表示数组的长度
 * 第二行输入 n 个数字表示数组的各个元素值。
 *
 * 输出描述：
 * 输出能得到的最大分数。
 */

import java.util.Scanner;

/**
 * 动态规划,
 * fx[i] : 选第 i 个位置时, 最大分数
 * dx[i] : 不选第 i 个位置时, 最大分数
 *
 * fx[i] = dx[i - 1] + sum[i]
 * dx[i] = Math.max(fx[i - 1], dx[i - 1])
 *
 * 这里我们将所有的相同的数据放入特定的位置, 这样我们选这个位置的数的时候, 就可以
 * 不用一个一个去找和这个数相同的数在哪里了
 * 时间复杂度 : O(n)
 * 空间复杂度 : O(n)
 */

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);

        int n = in.nextInt();

        // 这里提前开辟好空间
        int N = (int)1e4 + 10;

        // hash 数组
        int[] sum = new int[N];

        // 动态规划
        int[] fx = new int[N];
        int[] dx = new int[N];

        // 记录一下出现的最大值
        int max = 0;

        for (int i = 0; i < n; i++) {
            int x = in.nextInt();

            // 更新最大值
            max = Math.max(max, x);

            // 相同的数加在相同的位置
            sum[x] += x;
        }

        for (int i = 1; i <= max; i++) {

            // 动态转移方程
            fx[i] = dx[i - 1] + sum[i];
            dx[i] = Math.max(fx[i - 1], dx[i - 1]);
        }

        // 返回值
        System.out.println(Math.max(fx[max], dx[max]));
    }
}